import axios from 'axios';
import { ElMessage } from 'element-plus';
import Cookies from 'js-cookie';
import router from '@/router';

// 创建axios实例
const request = axios.create({
  baseURL: 'http://localhost:8080', // 基础URL
  timeout: 10000, // 请求超时时间
  withCredentials: true, // 设置跨域请求时是否携带cookie
});

// 添加请求拦截器
request.interceptors.request.use(
  (config) => {
    // 从cookie中获取token
    const token = Cookies.get('virtual_bank_token') || Cookies.get('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  (response) => {
    const res = response.data;
    
    // 如果code不是0，则认为请求失败
    if (res.code !== 0) {
      ElMessage.error(res.message || '请求失败');
      
      // 401: 未授权（token过期或无效）
      if (res.code === 401) {
        // 清除cookie
        Cookies.remove('token');
        
        // 跳转到登录页面
        router.push('/login');
      }
      
      return Promise.reject(new Error(res.message || '请求失败'));
    } else {
      return res;
    }
  },
  (error) => {
    console.error('请求错误', error);
    
    // 处理网络错误
    let message = '网络错误，请稍后重试';
    
    // 如果有响应对象
    if (error.response) {
      // 不管是401还是4001，只要是未登录相关的错误，都跳转到登录页面
      if (error.response.status === 401 || 
         (error.response.data && 
          (error.response.data.code === 401 || 
           error.response.data.code === 4001 || 
           (error.response.data.message && error.response.data.message.includes('未登录')))))
      {
        message = '未登录或登录已过期，请重新登录';
        // 清除cookie
        Cookies.remove('virtual_bank_token');
        Cookies.remove('token');
        
        // 延迟跳转，给用户一个看到错误提示的机会
        setTimeout(() => {
          // 使用location.href强制刷新页面
          window.location.href = '/login';
        }, 1500);
      } else if (error.response.status === 403) {
        message = '拒绝访问';
      } else if (error.response.status === 404) {
        message = '请求地址错误';
      } else if (error.response.status === 500) {
        message = '服务器内部错误';
      } else {
        message = `请求失败: ${error.response.status}`;
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      message = '服务器无响应';
    }
    
    ElMessage.error(message);
    return Promise.reject(error);
  }
);

export default request;
